package smlab.utils
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Stage;
	import flash.geom.Point;
	
	/**
	 * 弹出窗体辅助类
	 * @author simon
	 * 
	 */
	public class PopUpUtils
	{
		public function PopUpUtils()
		{
		}
		
		/**
		 * 使显示对象相对居中（相对于stage）
		 * 不论显示对象的注册点在哪里，也不论被 addChild 在哪个父级容器都可以居中
		 * 请确保显示对象已经被 addChild 并已经拥有 stage 后再调用此方法
		 * @param target			显示对象
		 * 
		 */
		public static function centerInStage(target:DisplayObject):void
		{
			if(!target){
				return;
			}
			
			if(target.stage && target.parent)
			{
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				var pRegInStage:Point=new Point;//显示对象居中后注册点应该在全局坐标内的坐标
				pRegInStage.x=(target.stage.stageWidth-target.width)/2+pReg.x;
				pRegInStage.y=(target.stage.stageHeight-target.height)/2+pReg.y;
				
				if(target.stage != target.parent)
				{
					var p:Point=target.parent.globalToLocal(pRegInStage);
					target.x=p.x;
					target.y=p.y;
				}else{
					target.x=pRegInStage.x;
					target.y=pRegInStage.y;
				}
			}
		}
		
		/**
		 * 使弹出窗体居中(相对于父容器)
		 * @param target
		 */
		public static function centerInParent(target:DisplayObject):void
		{
			if(!target){
				return;
			}
			
			if(target.parent)
			{
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				target.x=(target.parent.width-target.width)/2+pReg.x;
				target.y=(target.parent.height-target.height)/2+pReg.y;
			}
		}
		
		/**
		 * 使得显示对象的 X 坐标相对于舞台居中
		 * @param target
		 * 
		 */
		public static function X_CenterInStage(target:DisplayObject,_stage:Stage):void
		{
			if(!target){
				return;
			}
			
			if(target.stage && target.parent)
			{
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				var pRegInStage:Point=new Point;//显示对象居中后注册点应该在全局坐标内的坐标
				pRegInStage.x=(target.stage.stageWidth-target.width)/2+pReg.x;
				
				if(target.stage != target.parent)
				{
					var p:Point=target.parent.globalToLocal(pRegInStage);
					target.x=p.x;
				}else{
					target.x=pRegInStage.x;
				}
			}
		}
		
		/**
		 * 使得显示对象的 Y 坐标相对于舞台居中
		 * @param target
		 * 
		 */
		public static function Y_CenterInStage(target:DisplayObject,_stage:Stage):void
		{
			if(!target){
				return;
			}
			
			if(target.stage && target.parent)
			{
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				var pRegInStage:Point=new Point;//显示对象居中后注册点应该在全局坐标内的坐标
				pRegInStage.y=(target.stage.stageHeight-target.height)/2+pReg.y;
				
				if(target.stage != target.parent)
				{
					var p:Point=target.parent.globalToLocal(pRegInStage);
					target.y=p.y;
				}else{
					target.y=pRegInStage.y;
				}
			}
		}
		
		/**
		 * 使对象在父级中X轴距中
		 * @param target
		 * 
		 */
		public static function X_CenterInParent(target:DisplayObject):void
		{
			if(!target){
				return;
			}
			
			if(target.parent)
			{
				//可能 target 的坐标会影响整个 target.parent.width 的值，所以要先初始化一下
				var oldScaleX:Number = target.scaleX;
				var oldWidth:Number = target.width;
				target.scaleX = 0;
				target.x = 0;
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				target.x=(target.parent.width-oldWidth)/2+pReg.x;
				target.scaleX = oldScaleX;
			}
		}
		
		/**
		 * 使对象在父级中Y轴距中
		 * @param target
		 * 
		 */
		public static function Y_CenterInParent(target:DisplayObject):void
		{
			if(!target){
				return;
			}
			
			if(target.parent)
			{
				//可能 target 的坐标和宽高会影响整个 target.parent.height 的值，所以要先初始化一下
				var oldScaleY:Number = target.scaleY;
				var oldHeight:Number = target.height;
				target.scaleY = 0;
				target.y = 0;
				var pReg:Point=DisplayObjectUtil.getRegPoint(target);//注册点（相对于这个显示对象左上角(0,0)点的坐标点）
				target.y=(target.parent.height-oldHeight)/2+pReg.y;
				target.scaleY = oldScaleY;
			}
		}
		
		/**
		 * 设置一个显示对象相对于舞台的 x 坐标
		 * @param target
		 * @param _stage
		 * @param _x
		 * 
		 */
		public static function set_X_InStage(target:DisplayObject,_stage:Stage,_x:Number):void
		{
			if(!target){
				return;
			}
			
			if(target.parent==_stage){
				target.x=_x;
			}else{
				var point:Point=new Point;
				point.x=_x;
				var point2:Point=new Point;
				point2=_stage.globalToLocal(point);
				target.x=point2.x;
			}
		}
		
		/**
		 * 设置一个显示对象相对于舞台的 y 坐标
		 * @param target
		 * @param _stage
		 * @param _x
		 * 
		 */
		public static function set_Y_InStage(target:DisplayObject,_stage:Stage,_y:Number):void
		{
			if(!target){
				return;
			}
			
			if(target.parent==_stage){
				target.y=_y;
			}else{
				var point:Point=new Point;
				point.y=_y;
				var point2:Point=new Point;
				point2=_stage.globalToLocal(point);
				target.y=point2.y;
			}
		}
		
		/**
		 * 置顶一个显示对象
		 * @param target
		 * @param isBringToStage	在父容器还是 stage 置顶（如果是 true 在被 addchild 到 stage）
		 * 
		 */
		public static function bringToTop(target:DisplayObject,isBringToStage:Boolean=false):void
		{
			if(!target){
				return;
			}
			
			if(isBringToStage){
				if(target.stage){
					var p:Point=DisplayObjectUtil.getGlobalPoint(target);
					target.x=p.x;
					target.y=p.y;
					target.stage.addChild(target);
				}
			}else{
				if(target.parent){
					target.parent.addChild(target);
				}
			}
		}

	}
}